Skip to main content

ダイアログ:プロジェクト設定:静的分析ライト

シンボル: _cds_icon_stat_analy_light.png

関数:ダイアログは、ライトバージョンで実行されるチェックをアクティブにします。 CODESYS コードが生成されるたびの静的分析。

電話プロジェクト→プロジェクト設定 指図、 静的分析ライト カテゴリー

ヒント

コードにマークを付けることで、静的コード分析からコード行を除外できます。 {analysis ...} プラグマまたは {attribute 'analysis' := '...'} プラグマ。

詳細については、以下を参照してください。 コードを静的に分析する

追加のコンパイルチェック

SA0033:未使用の変数

宣言されているが、コンパイルされたプログラムコード内で使用されていない変数を検出します

GVL変数の場合:プロジェクトに複数のアプリケーションが存在する場合、現在アクティブなアプリケーションの下にあるオブジェクトのみが影響を受けます。アプリケーションが1つしかない場合は、 POUs ビューも影響を受けます。

SA0028:重複するメモリ領域

2つ以上の変数が同じメモリを予約しているコード行を検出します

たとえば、これは次の宣言で発生します。 var1 AT %QB21: INTvar2 AT %QD5: DWORD。この場合、両方の変数はバイト21を使用します。これは、変数のメモリ範囲が重複していることを意味します。

SA0006:いくつかのタスクからの書き込みアクセス

複数のタスクによって書き込まれる変数を検出します

SA0004:出力での複数の書き込みアクセス

複数の場所に書き込まれた出力を検出します

注:出力変数(VAR_IN_OUT)のさまざまなブランチに書き込まれます IFCASE ステートメント。

注:プラグマはこのルールを無効にすることはできません。

SA0027:識別子の複数の使用

プロジェクトのスコープ内の変数またはオブジェクト(POU)の名前/識別子の複数の使用を検出します

. 次のケースが検出されます。
  • 列挙定数の名前は、アプリケーション内の別の列挙と同じであるか、含まれているライブラリで使用されています。

  • 変数の名前は、アプリケーション内のオブジェクトの名前または統合ライブラリーの名前と同じです。

  • 変数の名前は、アプリケーションの列挙型の列挙型定数の名前または統合ライブラリーの名前と同じです。

  • オブジェクトの名前は、アプリケーション内の別のオブジェクトの名前と同じです。

  • 変数の名前はメソッドの名前と同じです。

  • オブジェクトの名前は、上位オブジェクト(「親オブジェクト」)の名前と同じです。

SA0167:一時的なFunctionBlockインスタンスを報告します

このチェックは、一時変数として宣言されている関数ブロックインスタンスを検出します。これは、メソッドまたは関数で宣言されているインスタンスに影響します。 VAR_TEMP、したがって、各処理サイクルまたはPOU呼び出しごとに再初期化されます。

SA0175:文字列に対する疑わしい操作

デフォルトでは非アクティブ

UTF-8エンコーディングが疑われるコードの場所を検出します

次の構成が含まれています。

  • シングルバイト文字列へのインデックスアクセス

    例: str[2]

    メッセージ: 文字列に対する疑わしい操作:インデックスアクセス '<式>'

  • シングルバイト文字列へのアドレスアクセス

    例: ADR(str)

    メッセージ:文字列に対する疑わしい操作:インデックスアクセスの可能性 '<式>'

  • 標準ライブラリの文字列関数を呼び出す それ外 CONCATLEN

    メッセージ: 文字列に対する疑わしい操作:インデックスアクセスの可能性 '<式>'

  • 非ASCII文字を含むシングルバイトリテラル

    例:

    str := '99€';

    str := 'Ä';

    メッセージ: 文字列に対する疑わしい操作:リテラル '<literal>'に非ASCII文字が含まれています

チェックの結果によっては、有効にしないことをお勧めします STRINGのUTF8エンコーディング コンパイルオプション。

詳細については、以下を参照してください。 コンパイルオプション

544.

SA0003:空のステートメント

;
(* Comment *);
iVar;

SA0006:同時アクセス

FUNCTION_BLOCK ADD_FB
g_iTemp1 := g_iTemp1 + INT#1;
PROGRAM PLC_PRG  //controlled by MainTask
g_iTemp1 := g_iTemp1 + INT#2;
g_xTemp2 := g_iTemp1 > INT#10;
PROGRAM PLC_PRG_1  //controlled by SubTask
g_iTemp1 := g_iTemp1 - INT#3;
g_xTemp2 := g_iTemp1 < INT#-10;

SA0004:出力での複数の書き込みアクセス

VAR_GLOBAL
    g_xVar AT %QX0.0 : BOOL ;
    g_iTest AT %QW0 : INT ;
END_VAR
PROGRAM PLC_PRG
IF iCondition < INT#0 THEN
    g_xVar := TRUE;
    g_iTest := INT#12;
END_IF
CASE iCondition OF
    INT#1:
        g_xVar := FALSE;
    INT#2:
        g_iTest := INT#11;
    ELSE
        g_xVar := TRUE;
        g_iTest := INT#9;
END_CASE

SA0006:いくつかのタスクからの書き込みアクセス

FUNCTION_BLOCK ADD_FB
g_iTemp1 := g_iTemp1 + INT#1;
PROGRAM PLC_PRG  // Controlled by MainTask
g_iTemp1 := g_iTemp1 + INT#2;
g_xTemp2 := g_iTemp1 > INT#10;
PROGRAM PLC_PRG_1  //Controlled by SubTask
g_iTemp1 := g_iTemp1 - INT#3;
g_xTemp2 := g_iTemp1 < INT#-10;

SA0027:名前の複数の使用

PROGRAM PLC_PRG
VAR
    ton : INT; // error SA0027
END_VAR

SA0029:宣言とは異なるコードの表記

A PLC_PRG POUと fnc (機能)POUはデバイスツリーに存在します。

PROGRAM PLC_PRG
VAR
    iVar:INT;
    _123test_var_: INT;
END_VAR
ivar := iVar + 1; // notation different to that in the declaration part ->   SA0029
_123TEST_var_ := _123test_var_INT; // notation different to that in the declaration part ->   SA0029
Fnc(); // notation different to that in the devices tree ->   SA0029

SA0167:一時的なFunctionBlockインスタンスを報告します

PROGRAM PLC_PRG
VAR
END_VAR
VAR_TEMP
    yafb: AFB;
END_VAR

FUNCTION Fun : INT
VAR_INPUT
END_VAR
VAR
    funafb: AFB;
END_VAR
METHOD METH: INT
VAR_INPUT
END_VAR
VAR
    methafb: AFB;
END_VAR


詳細については、以下を参照してください。 コードを静的に分析する